iT邦幫忙

2023 iThome 鐵人賽

DAY 4
0
Web 3

以 Python 進入以太坊虛擬機 (EVM) 的幻想境界系列 第 4

虛擬境界 4:Stack (DUP & SWAP)

  • 分享至 

  • xImage
  •  

今天來介紹 Dup 和 swap opcode,這兩個也是操作 stack 很重要的兩個功能

DUP 指令概述

DUP 指令是 EVM 中常用的指令之一,它用於複製堆疊中指定位置的值,並將其放置於堆疊頂部。通過 DUP 指令,可以在堆疊中複製特定位置的值,為後續運算或操作準備數據。

DUP 指令實現

class Stack:
# ... 其他程式碼 ...

	def dup(self, position):
    # 複製指定位置的值並推送到堆疊
    value = self.evm.stack[-position]
    self.evm.stack.append(value)

上面的 dup 函數接收一個參數 position,表示要複製的值在堆疊中的位置。它會將堆疊中第 -position 個元素複製一份並推送到堆疊中,相當於 DUP 指令的效果。

SWAP 指令概述

SWAP 指令用於交換堆疊中兩個特定位置的值。通過 SWAP 指令,我們可以方便地交換堆疊中兩個元素的位置,這對於特定運算或操作可能是必需的。

SWAP 指令實現

class Stack:
    # ... 其他程式碼 ...

    def swap(self, position1, position2):
        # 交換指定位置的兩個值
        self.evm.stack[-position1], self.evm.stack[-position2] = self.evm.stack[-position2], self.evm.stack[-position1]

上面的 swap 函數接收兩個參數 position1position2,表示要交換的兩個值在堆疊中的位置。它會交換這兩個位置上的值,實現 SWAP 指令的效果。

結合執行


#
# Duplicate Operations
#
DUP1 = 0x80
DUP2 = 0x81
DUP3 = 0x82
DUP4 = 0x83
DUP5 = 0x84
DUP6 = 0x85
DUP7 = 0x86
DUP8 = 0x87
DUP9 = 0x88
DUP10 = 0x89
DUP11 = 0x8A
DUP12 = 0x8B
DUP13 = 0x8C
DUP14 = 0x8D
DUP15 = 0x8E
DUP16 = 0x8F

#
# Exchange Operations
#
SWAP1 = 0x90
SWAP2 = 0x91
SWAP3 = 0x92
SWAP4 = 0x93
SWAP5 = 0x94
SWAP6 = 0x95
SWAP7 = 0x96
SWAP8 = 0x97
SWAP9 = 0x98
SWAP10 = 0x99
SWAP11 = 0x9A
SWAP12 = 0x9B
SWAP13 = 0x9C
SWAP14 = 0x9D
SWAP15 = 0x9E
SWAP16 = 0x9F

現在,我們將 DUP 和 SWAP 指令整合到 execute 方法中:

def execute(self):
    while self.pc < len(self.code):
        opCode = self.next()

        # 根據 opcode 執行相應操作
        if opcodes.PUSH0 <= opCode <= opcodes.PUSH32 or opCode == opcodes.POP:
            stack.Stack(self, opCode)
        elif opcodes.DUP1 <= opCode <= opcodes.DUP16:
            stack.Stack(self, opcodes)
        elif opcodes.SWAP1 <= opCode <= opcodes.SWAP16:
            stack.Stack(self, opcodes)

execute 方法中,我們檢查 opcode 是否為 DUP 或 SWAP 範圍內的指令,並根據相應的位置調用 dupswap 函數,從而執行相應的 DUP 或 SWAP 操作。

現在你已經實現了 DUP 和 SWAP 指令,可以進一步擴充你的 EVM 功能。如果需要更多幫助,隨時提問!


上一篇
虛擬境界 3:Stack (PUSH & POP)
下一篇
虛擬境界 5:控制流 Flow
系列文
以 Python 進入以太坊虛擬機 (EVM) 的幻想境界30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言